#pragma once
#include <string>
#include "server/rtmp/amf0/amf0_inc.hpp"
#include "server/rtmp/rtmp_protocol/rtmp_define.hpp"
#include "server/rtmp/rtmp_message/rtmp_message.hpp"
#include "server/rtmp/rtmp_message/command_message/rtmp_fcpublish_message.hpp"
namespace mms
{
    class RtmpFCPublishRespMessage
    {
    public:
        RtmpFCPublishRespMessage(const RtmpFCPublishMessage &rel_msg, const std::string &name)
        {
            command_name_.set_value(name);
            transaction_id_.set_value(rel_msg.transaction_id_.get_value());
        }

        RtmpFCPublishRespMessage()
        {
        }

        virtual ~RtmpFCPublishRespMessage()
        {
        }

    public:
        int32_t decode(std::shared_ptr<RtmpMessage> rtmp_msg)
        {
            int32_t consumed = 0;
            int32_t pos = 0;
            const uint8_t *payload = rtmp_msg->payload_;
            int32_t len = rtmp_msg->payload_size_;
            consumed = command_name_.decode(payload, len);
            if (consumed < 0)
            {
                return -1;
            }
            pos += consumed;
            payload += consumed;
            len -= consumed;

            consumed = transaction_id_.decode(payload, len);
            if (consumed < 0)
            {
                return -2;
            }
            pos += consumed;
            payload += consumed;
            len -= consumed;

            consumed = command_obj_.decode(payload, len);
            if (consumed < 0)
            {
                return -3;
            }
            pos += consumed;
            payload += consumed;
            len -= consumed;

            consumed = udef_.decode(payload, len);
            if (consumed < 0)
            {
                return -3;
            }
            pos += consumed;
            payload += consumed;
            len -= consumed;
            return pos;
        }

        std::shared_ptr<RtmpMessage> encode()
        {
            size_t s = 0;
            s += command_name_.size();
            s += transaction_id_.size();
            s += command_obj_.size();
            s += udef_.size();

            std::shared_ptr<RtmpMessage> rtmp_msg = std::make_shared<RtmpMessage>(s);
            rtmp_msg->chunk_stream_id_ = RTMP_CHUNK_ID_PROTOCOL_CONTROL_MESSAGE;
            rtmp_msg->timestamp_ = 0;
            rtmp_msg->message_type_id_ = RTMP_MESSAGE_TYPE_AMF0_COMMAND;
            rtmp_msg->message_strean_id_ = RTMP_MESSAGE_ID_PROTOCOL_CONTROL;
            // window ack_size
            uint8_t *payload = rtmp_msg->payload_;
            int32_t len = s;
            int32_t consumed = command_name_.encode(payload, len);
            if (consumed < 0)
            {
                return nullptr;
            }
            payload += consumed;
            len -= consumed;

            consumed = transaction_id_.encode(payload, len);
            if (consumed < 0)
            {
                return nullptr;
            }
            payload += consumed;
            len -= consumed;

            consumed = command_obj_.encode(payload, len);
            if (consumed < 0)
            {
                return nullptr;
            }
            payload += consumed;
            len -= consumed;

            consumed = udef_.encode(payload, len);
            if (consumed < 0)
            {
                return nullptr;
            }
            payload += consumed;
            len -= consumed;
            rtmp_msg->payload_size_ = s;
            return rtmp_msg;
        }

        Amf0Null &cmdObj()
        {
            return command_obj_;
        }

    private:
        Amf0String command_name_;
        Amf0Number transaction_id_;
        Amf0Null command_obj_;
        Amf0Undefined udef_;
    };
};